package controllers

import (
	"ExchangeApp/global"
	"ExchangeApp/models"
	"ExchangeApp/utils"
	"github.com/gin-gonic/gin"
	"net/http"
)

// Register 用户注册函数
// @Summary 用户注册
// @Description 创建新用户并返回JWT令牌
// @Tags 认证
// @Accept json
// @Produce json
// @Param user body models.User true "用户信息"
// @Success 200 {object} map[string]string
// @Failure 400 {object} map[string]string
// @Failure 500 {object} map[string]string
// @Router /register [post]
func Register(ctx *gin.Context) {
	// 声明用户模型对象
	var user models.User

	// 将请求体中的JSON数据绑定到user结构体
	if err := ctx.ShouldBindJSON(&user); err != nil {
		// 如果JSON解析失败，返回400错误和错误详情
		ctx.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(), // 将错误对象转换为字符串
		})
		return
	}

	// 对用户密码进行bcrypt加密
	hashedPwd, err := utils.HashPassword(user.Password)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 更新用户密码为加密后的哈希值
	user.Password = hashedPwd

	// 生成JWT令牌
	token, err := utils.GenerateJWT(user.Username)
	if err != nil {
		// 生成失败，返回错误信息
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 数据库 创建 新用户记录
	if err := global.Db.Create(&user).Error; err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 注册成功，返回JWT令牌
	ctx.JSON(http.StatusOK, gin.H{"token": token})
}

// Login 用户登录函数
// @Summary 用户登录
// @Description 验证用户凭据并返回JWT令牌
// @Tags 认证
// @Accept json
// @Produce json
// @Param login body object{username=string,password=string} true "登录信息"
// @Success 200 {object} map[string]string
// @Failure 400 {object} map[string]string
// @Failure 401 {object} map[string]string
// @Failure 500 {object} map[string]string
// @Router /login [post]
func Login(ctx *gin.Context) {
	// 定义接收前端传入数据的结构体
	var input struct {
		Username string `json:"username"` // 用户名
		Password string `json:"password"` // 密码
	}

	// 将JSON数据绑定到结构体
	if err := ctx.ShouldBindJSON(&input); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 声明用户模型变量，用于后续数据库查询
	var user models.User
	// 根据用户名查询用户
	if err := global.Db.Where("username = ?", input.Username).First(&user).Error; err != nil {
		ctx.JSON(http.StatusUnauthorized, gin.H{
			"error": "用户不存在",
		})
		return
	}

	// 检查密码是否正确
	if !utils.CheckPassword(input.Password, user.Password) {
		// 密码错误，返回401未授权
		ctx.JSON(http.StatusUnauthorized, gin.H{"error": "密码错误"})
		return
	}

	// 生成JWT令牌
	token, err := utils.GenerateJWT(user.Username)
	if err != nil {
		// 生成失败，返回错误信息
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 登录成功，返回JWT令牌
	ctx.JSON(http.StatusOK, gin.H{"token": token})
}
